home *** CD-ROM | disk | FTP | other *** search
- package Common.ParticleSystem
- {
- import Common.FastMath;
- import flash.display.Bitmap;
- import flash.display.Loader;
- import flash.display.MovieClip;
- import flash.display.Sprite;
- import flash.events.Event;
- import flash.events.IOErrorEvent;
- import flash.geom.Point;
- import flash.net.URLRequest;
-
- public class Emitter extends Sprite
- {
-
- public static const C_PARTICLE_ELLIPSE:* = 2;
-
- public static const C_PARTICLE_POINT:* = 0;
-
- public static const C_PARTICLE_LINE:* = 3;
-
- public static const C_PARTICLE_AREA:* = 1;
-
-
- private var tintBVar:Number;
-
- private var active:Boolean;
-
- private var wind:Point;
-
- private var tintRVar:Number;
-
- private var velocityVar:Number;
-
- private var life:Number;
-
- private var durationStart:uint;
-
- private var fadeOut:Boolean;
-
- private var spriteLoader:Loader;
-
- private var gravity:Point;
-
- private var rateStart:int;
-
- private var spawnType:uint;
-
- private var weight:Number;
-
- private var spread:int;
-
- private var scale:Number;
-
- private var scaleVar:Number;
-
- private var scaleDeath:Number;
-
- private var weightVar:Number;
-
- private var direction:int;
-
- private var bitmapCache:Boolean;
-
- private var tintB:Number;
-
- private var maxParticles:uint;
-
- private var duration:uint;
-
- private var particles:Array;
-
- private var simSpeed:Number;
-
- private var tintG:Number;
-
- private var rotationRate:Number;
-
- private var pointB:Point;
-
- private var affectors:Array;
-
- private var fadeIn:Boolean;
-
- private var rotateAuto:Boolean;
-
- private var pointA:Point;
-
- private var tintR:Number;
-
- private var rotationRateVar:Number;
-
- private var tintGVar:Number;
-
- private var velocity:Number;
-
- private var rate:int;
-
- private var lifeVar:Number;
-
- private var friction:Number;
-
- public function Emitter()
- {
- super();
- particles = new Array();
- affectors = new Array();
- spawnType = 0;
- mouseEnabled = false;
- spriteLoader = new Loader();
- pointA = new Point(0,0);
- pointB = new Point(10,10);
- life = 30;
- lifeVar = 20;
- rate = 30;
- simSpeed = 1;
- duration = 1;
- bitmapCache = false;
- maxParticles = 200;
- weight = 1;
- weightVar = 0;
- velocity = 30;
- velocityVar = 10;
- rotationRate = 5;
- rotationRateVar = 10;
- rotateAuto = false;
- friction = 0.1;
- direction = 180;
- spread = 360;
- gravity = new Point(0,0);
- wind = new Point(0,0);
- fadeIn = false;
- fadeOut = false;
- scale = 1;
- scaleVar = 0;
- scaleDeath = 1;
- tintR = 0;
- tintRVar = 0;
- tintG = 0;
- tintGVar = 0;
- tintB = 0;
- tintBVar = 0;
- }
-
- public static function fromXML(param1:XML) : Emitter
- {
- var _loc2_:Emitter = null;
- var _loc3_:XML = null;
- var _loc4_:String = null;
- var _loc5_:String = null;
- _loc2_ = new Emitter();
- for each(_loc3_ in param1.attributes())
- {
- _loc4_ = _loc3_;
- _loc5_ = String(_loc3_.name());
- switch(_loc5_)
- {
- case "maxParticles":
- _loc2_.maxParticles = uint(_loc4_);
- break;
- case "sprite":
- _loc2_.loadSprite(_loc4_);
- break;
- case "blendMode":
- _loc2_.blendMode = _loc4_;
- break;
- case "spawnType":
- _loc2_.spawnType = Emitter.getParticleType(_loc4_);
- break;
- case "duration":
- _loc2_.durationStart = uint(_loc4_);
- break;
- case "weight":
- _loc2_.weight = Number(_loc4_);
- break;
- case "weightVar":
- _loc2_.weightVar = Number(_loc4_);
- break;
- case "velocity":
- _loc2_.velocity = Number(_loc4_);
- break;
- case "velocityVar":
- _loc2_.velocityVar = Number(_loc4_);
- break;
- case "rotationRate":
- _loc2_.rotationRate = Number(_loc4_);
- break;
- case "rotationRateVar":
- _loc2_.rotationRateVar = Number(_loc4_);
- break;
- case "rotateAuto":
- _loc2_.rotateAuto = _loc4_ == "true";
- break;
- case "friction":
- _loc2_.friction = Number(_loc4_);
- break;
- case "direction":
- _loc2_.direction = Number(_loc4_);
- break;
- case "spread":
- _loc2_.spread = Number(_loc4_);
- break;
- case "life":
- _loc2_.life = Number(_loc4_);
- break;
- case "lifeVar":
- _loc2_.lifeVar = Number(_loc4_);
- break;
- case "rate":
- _loc2_.rateStart = int(_loc4_);
- break;
- case "fadeIn":
- _loc2_.fadeIn = _loc4_ == "true";
- break;
- case "fadeOut":
- _loc2_.fadeOut = _loc4_ == "true";
- break;
- case "scale":
- _loc2_.scale = Number(_loc4_);
- break;
- case "scaleVar":
- _loc2_.scaleVar = Number(_loc4_);
- break;
- case "scaleDeath":
- _loc2_.scaleDeath = Number(_loc4_);
- break;
- case "tintR":
- _loc2_.tintR = Number(_loc4_);
- break;
- case "tintG":
- _loc2_.tintG = Number(_loc4_);
- break;
- case "tintB":
- _loc2_.tintB = Number(_loc4_);
- break;
- case "tintRVar":
- _loc2_.tintRVar = Number(_loc4_);
- break;
- case "tintGVar":
- _loc2_.tintGVar = Number(_loc4_);
- break;
- case "tintBVar":
- _loc2_.tintBVar = Number(_loc4_);
- break;
- case "gravityX":
- _loc2_.gravity.x = Number(_loc4_);
- break;
- case "gravityY":
- _loc2_.gravity.y = Number(_loc4_);
- break;
- case "windX":
- _loc2_.wind.x = Number(_loc4_);
- break;
- case "windY":
- _loc2_.wind.y = Number(_loc4_);
- break;
- }
- }
- return _loc2_;
- }
-
- public static function clone(param1:Emitter) : Emitter
- {
- var _loc2_:Emitter = null;
- var _loc3_:* = undefined;
- _loc2_ = new Emitter();
- _loc2_.spawnType = param1.spawnType;
- _loc2_.PointA.x = param1.PointA.x;
- _loc2_.PointA.y = param1.PointA.y;
- _loc2_.PointB.x = param1.PointB.x;
- _loc2_.pointB.y = param1.PointB.y;
- _loc2_.life = param1.life;
- _loc2_.lifeVar = param1.lifeVar;
- _loc2_.rate = param1.rate;
- _loc2_.rateStart = param1.rateStart;
- _loc2_.simSpeed = param1.simSpeed;
- _loc2_.duration = param1.duration;
- _loc2_.durationStart = param1.durationStart;
- _loc2_.maxParticles = param1.maxParticles;
- _loc2_.weight = param1.weight;
- _loc2_.weightVar = param1.weightVar;
- _loc2_.velocity = param1.velocity;
- _loc2_.velocityVar = param1.velocityVar;
- _loc2_.rotationRate = param1.rotationRate;
- _loc2_.rotationRateVar = param1.rotationRateVar;
- _loc2_.rotateAuto = param1.rotateAuto;
- _loc2_.friction = param1.friction;
- _loc2_.direction = param1.direction;
- _loc2_.spread = param1.spread;
- _loc2_.gravity.x = param1.gravity.x;
- _loc2_.gravity.y = param1.gravity.y;
- _loc2_.wind.x = param1.wind.x;
- _loc2_.wind.y = param1.wind.y;
- _loc2_.fadeIn = param1.fadeIn;
- _loc2_.fadeOut = param1.fadeOut;
- _loc2_.scale = param1.scale;
- _loc2_.scaleVar = param1.scaleVar;
- _loc2_.scaleDeath = param1.scaleDeath;
- _loc2_.tintR = param1.tintR;
- _loc2_.tintRVar = param1.tintRVar;
- _loc2_.tintG = param1.tintG;
- _loc2_.tintGVar = param1.tintGVar;
- _loc2_.tintB = param1.tintB;
- _loc2_.tintBVar = param1.tintBVar;
- _loc3_ = Particle(param1.getChildAt(0)).getChildAt(0);
- if(!(_loc3_ is Bitmap))
- {
- _loc3_ = Object(_loc3_).constructor;
- }
- _loc2_.initParticles(_loc3_);
- return _loc2_;
- }
-
- public static function getParticleType(param1:String) : uint
- {
- return uint(Emitter[param1]);
- }
-
- public function startEmission() : void
- {
- Active = visible = true;
- rate = rateStart;
- duration = durationStart;
- }
-
- public function get Active() : Boolean
- {
- return active;
- }
-
- public function set Active(param1:Boolean) : *
- {
- this.active = param1;
- }
-
- private function spawn(param1:Particle) : void
- {
- var _loc2_:Point = null;
- param1.reset();
- param1.Active = true;
- param1.Weight = FastMath.variance(weight,weightVar);
- param1.setVelocityDir(FastMath.variance(velocity,velocityVar),int(Math.floor(FastMath.variance(direction,spread,0.5))));
- param1.revive(life,lifeVar);
- _loc2_ = new Point(0,0);
- switch(spawnType)
- {
- case C_PARTICLE_AREA:
- _loc2_ = FastMath.magDir(Math.random(),Math.floor(Math.random() * 360));
- _loc2_.x *= pointB.x;
- _loc2_.y *= pointB.y;
- _loc2_.offset(pointA.x,pointA.y);
- break;
- case C_PARTICLE_ELLIPSE:
- _loc2_.x = FastMath.variance(0,1,0.5);
- _loc2_.y = FastMath.variance(0,1,0.5);
- _loc2_.normalize(1);
- _loc2_.x *= pointB.x;
- _loc2_.y *= pointB.y;
- _loc2_.offset(pointA.x,pointA.y);
- break;
- case C_PARTICLE_LINE:
- _loc2_ = Point.interpolate(pointA,pointB,Math.random());
- break;
- default:
- _loc2_ = pointA;
- }
- param1.x = _loc2_.x;
- param1.y = _loc2_.y;
- param1.RotationRate = FastMath.variance(rotationRate,rotationRateVar);
- param1.RotateAuto = rotateAuto;
- param1.ScaleBirth = FastMath.variance(scale,scaleVar);
- param1.ScaleDeath = scaleDeath;
- param1.blendMode = blendMode;
- }
-
- public function handleIOError(param1:IOErrorEvent) : void
- {
- trace("Load failed: IO error: " + param1.text);
- }
-
- public function initContainer(param1:Event) : void
- {
- var _loc2_:Class = null;
- var _loc3_:Bitmap = null;
- bitmapCache = spriteLoader.content is Bitmap;
- if(bitmapCache)
- {
- initParticles(Bitmap(param1.target.loader.content));
- }
- else
- {
- initParticles(Object(MovieClip(spriteLoader.content).getChildAt(0)).constructor);
- }
- }
-
- public function initParticles(param1:*) : *
- {
- var _loc2_:* = undefined;
- var _loc3_:Particle = null;
- var _loc4_:Bitmap = null;
- _loc2_ = 0;
- while(_loc2_ < maxParticles)
- {
- _loc3_ = new Particle();
- if(param1 is Bitmap)
- {
- (_loc4_ = new Bitmap(param1.bitmapData)).x = param1.width * -0.5;
- _loc4_.y = param1.height * -0.5;
- _loc3_.addChild(_loc4_);
- _loc3_.cacheAsBitmap = true;
- }
- else
- {
- _loc3_.addChild(new param1());
- }
- addChild(_loc3_);
- _loc3_.Index = _loc2_;
- _loc3_.Active = false;
- _loc3_.Life = 0;
- particles[_loc2_] = _loc3_;
- _loc2_++;
- }
- }
-
- public function loadSprite(param1:String) : void
- {
- var _loc2_:String = null;
- _loc2_ = "Assets/Particles/Sprites/" + param1;
- spriteLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,initContainer);
- spriteLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,handleIOError);
- spriteLoader.load(new URLRequest(_loc2_));
- }
-
- public function get PointA() : Point
- {
- return pointA;
- }
-
- public function get PointB() : Point
- {
- return pointB;
- }
-
- public function stopEmission() : void
- {
- var _loc1_:int = 0;
- var _loc2_:* = undefined;
- Active = visible = false;
- rate = 0;
- duration = 1;
- _loc1_ = this.numChildren;
- while(--_loc1_ != -1)
- {
- _loc2_ = getChildAt(_loc1_);
- _loc2_.visible = false;
- removeChildAt(_loc1_);
- }
- }
-
- public function update() : void
- {
- var _loc1_:uint = 0;
- var _loc2_:Boolean = false;
- var _loc3_:Particle = null;
- if(duration > 1)
- {
- if(--duration == 1)
- {
- Active = false;
- }
- }
- _loc1_ = uint(rate);
- _loc2_ = true;
- for each(_loc3_ in particles)
- {
- if(_loc3_.Active)
- {
- applyForces(_loc3_);
- _loc2_ = false;
- }
- else if(Active && _loc1_ > 0 && (duration > 1 || duration == 0))
- {
- _loc1_--;
- spawn(_loc3_);
- applyForces(_loc3_);
- _loc2_ = false;
- }
- }
- if(_loc2_)
- {
- stopEmission();
- }
- }
-
- private function applyForces(param1:Particle) : void
- {
- var _loc2_:Number = NaN;
- var _loc3_:Number = NaN;
- var _loc4_:Number = NaN;
- var _loc5_:Number = NaN;
- var _loc6_:Number = NaN;
- var _loc7_:Number = NaN;
- var _loc8_:Number = NaN;
- _loc2_ = gravity.x + wind.x;
- _loc3_ = gravity.y + wind.y;
- _loc4_ = _loc2_ / param1.Weight;
- _loc5_ = _loc3_ / param1.Weight;
- _loc6_ = 1 - friction;
- param1.Velocity.x = (param1.Velocity.x + _loc4_ * simSpeed) * _loc6_;
- param1.Velocity.y = (param1.Velocity.y + _loc5_ * simSpeed) * _loc6_;
- param1.x += param1.Velocity.x;
- param1.y += param1.Velocity.y;
- param1.rotate();
- _loc7_ = param1.Age / param1.Life;
- _loc8_ = 1;
- if(fadeIn && fadeOut)
- {
- if(_loc7_ >= 0.5)
- {
- _loc8_ = (1 - _loc7_) * 2;
- }
- else
- {
- _loc8_ = _loc7_ * 2;
- }
- }
- else if(fadeIn && !fadeOut)
- {
- _loc8_ = 1 - _loc7_;
- }
- else if(!fadeIn && fadeOut)
- {
- _loc8_ = _loc7_;
- }
- else
- {
- _loc8_ = 1;
- }
- param1.alpha = _loc8_;
- param1.grow(1 - _loc7_);
- if(--param1.Age <= 0)
- {
- param1.Active = false;
- }
- }
- }
- }
-